home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Disc to the Future 2
/
Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin
/
MAC
/
THINKC
/
4_0
/
FILE_SEA
/
FILESCAN.C
next >
Wrap
Text File
|
1991-01-17
|
13KB
|
534 lines
/*
*
* Clear View Systems 1990-1991
* Clear View is Scott Roberts & Wes Zuber
*
* 10084 Big Pine Dr.
* Alta Loma, CA 91701
*
* CIS 72607,3502
*
*
*
*
*/
#include "FileScan.h"
#include "MemoryMgr.h"
#include "ResourceMgr.h"
#include "OSUtil.h"
#include "StdFilePkg.h"
/*
-----------------------------------------------------------------------------
Searches for the file name in theFileRec, based on the search criteria passed
in the searchIdx parameter.
-----------------------------------------------------------------------------
*/
short doFileSearch(
register fileFindRec *theFileRec,
register long searchIdx)
{
register int retval;
WDPBRec wp;
HFileInfo cp;
SysEnvRec theWorld;
char cname[32],fileName[32];
if (! theFileRec->fileName[0]) /* is something there? */
return(fnfErr);
/* cname seems to be a duplicate of fileName, but cname is unstable where fileName is */
BlockMove(theFileRec->fileName,cname,32);
BlockMove(theFileRec->fileName,fileName,32);
CtoPstr(cname);
CtoPstr(fileName);
theFileRec->ioDirID = 0L; /* To test later on if anything changed it */
cp.ioCompletion = 0L;
cp.ioNamePtr = cname;
retval = fnfErr;
searchIdx &= UPPERMASK; /* Strip off unwanted options */
while ((retval == fnfErr) && searchIdx)
{
/* set up cp to defaults */
cp.ioVRefNum = 0;
cp.ioDirID = 0L;
cp.ioFDirIndex = 0;
if (searchIdx & CURRENT)
{
/* look at PMSP */
retval = PBGetCatInfo(&cp,false);
searchIdx &= ~CURRENT;
}
else if (searchIdx & BOOTDIR)
{
if (! (retval = SysEnvirons(2,&theWorld)))
{
cp.ioVRefNum = theWorld.sysVRefNum;
if (searchIdx & RESTRICT)
{
cp.ioFDirIndex = 0;
retval = PBGetCatInfo(&cp,false);
}
else
{
cp.ioFDirIndex = -1;
if (! (retval = PBGetCatInfo(&cp,false)))
retval = scanFolder(&cp,fileName);
}
}
searchIdx &= ~BOOTDIR;
}
else if (searchIdx & FOLDER)
{
wp.ioCompletion = 0L;
wp.ioNamePtr = 0L;
if (! (retval = PBHGetVol(&wp,false)))
{
cp.ioVRefNum = wp.ioWDVRefNum;
cp.ioDirID = wp.ioWDDirID;
if (searchIdx & RESTRICT)
retval = PBGetCatInfo(&cp,false);
else
retval = scanFolder(&cp,fileName);
}
searchIdx &= ~FOLDER;
}
else if (searchIdx & PARENT)
{
wp.ioCompletion = 0L;
wp.ioNamePtr = 0L;
if (! (retval = PBHGetVol(&wp,false)))
{
cp.ioVRefNum = wp.ioWDVRefNum;
cp.ioDirID = wp.ioWDDirID;
cp.ioFDirIndex = -1;
if (! (retval = PBGetCatInfo(&cp,false)))
{
cp.ioDirID = cp.ioFlParID;
if (searchIdx & RESTRICT)
{
cp.ioFDirIndex = 0;
BlockMove(fileName,cp.ioNamePtr,32);
retval = PBGetCatInfo(&cp,false);
}
else
retval = scanFolder(&cp,fileName);
}
}
searchIdx &= ~PARENT;
}
else if (searchIdx & WVOLUME)
{
cp.ioDirID = 2L;
if (searchIdx & RESTRICT)
retval = PBGetCatInfo(&cp,false);
else
retval = scanFolder(&cp,fileName);
searchIdx &= ~WVOLUME;
}
else if (searchIdx & ALLVOLUME)
{
retval = scanAllVolumes(&cp,fileName,(searchIdx & RESTRICT)?true:false);
searchIdx &= ~ALLVOLUME;
}
else if (searchIdx & ALLWD)
{
retval = scanAllWD(&cp,fileName,(searchIdx & RESTRICT)?true:false);
searchIdx &= ~ALLWD;
}
else
searchIdx = 0L; /* unknown search value, abandon */
}
if (! (retval || theFileRec->ioDirID))
{
theFileRec->ioVRefNum = cp.ioVRefNum;
theFileRec->ioDirID = cp.ioFlParID;
}
return(retval);
}
/*
-----------------------------------------------------------------------------
file look up stuff, use this to let the user fill in the file record.
-----------------------------------------------------------------------------
*/
short fileLook(
fileFindRec *fileFindPtr,
FileTypeRec *fileTypes,
long *theWDid)
{
volumeParam pb1;
Point where;
SFTypeList typeList;
SFReply reply;
Str255 messStr;
where.v=60;
where.h=80;
sprintf(messStr,"Please locate the file %s",fileFindPtr->fileName);
CtoPstr(messStr);
ParamText(messStr,"\p","\p","\p");
if (fileTypes)
{
BlockMove(&fileTypes->fileTypes,&typeList,fileTypes->noOfTypes * sizeof(long));
SFGetFile(where,"\p",0L,fileTypes->noOfTypes,&typeList,0L,&reply);
}
else
SFGetFile(where,"\p",0L,-1,&typeList,0L,&reply);
if (reply.good)
{
PtoCstr(reply.fName);
BlockMove(reply.fName,fileFindPtr->fileName,32);
fileFindPtr->ioVRefNum = -(SFSaveDisk);
fileFindPtr->ioDirID = CurDirStore;
if (theWDid)
*theWDid = reply.vRefNum;
return(noErr);
}
else /* reply not good */
return(fnfErr);
}
/*
-----------------------------------------------------------------------------
sets the current directory and volume based on the file record passed.
this routine will need to be called before actually accessing the file.
-----------------------------------------------------------------------------
*/
short fileSetDflt(
fileFindRec *fileFindPtr,
long *theWDid)
{
HVolumeParam HParmBlkRec;
WDPBRec WDPBlkRec;
short errNo;
memset(&WDPBlkRec,0,sizeof(WDPBRec));
WDPBlkRec.ioNamePtr = 0L;
WDPBlkRec.ioVRefNum = fileFindPtr->ioVRefNum;
WDPBlkRec.ioWDDirID = fileFindPtr->ioDirID;
WDPBlkRec.ioWDProcID = 'ERIK';
if (! (errNo = PBOpenWD(&WDPBlkRec,false)))
errNo = PBSetVol(&WDPBlkRec,false);
*theWDid = WDPBlkRec.ioVRefNum;
fileFindPtr->ioVRefNum = WDPBlkRec.ioVRefNum;
return(errNo);
}
/*
-----------------------------------------------------------------------------
saves our file record to the current resource file.
Use this routine to save a file location. Use the complementrary routine
fileGetFromRsrc to later retreive the file record.
-----------------------------------------------------------------------------
*/
short fileSaveToRsrc(
fileFindRec *fileFindPtr,
short rsrcID)
{
fileSaveRec theFileSave;
Handle rsrcHandle;
short errno;
char rsrcTitle[32];
if (errno = fileFindToSave(fileFindPtr,&theFileSave))
return(errno);
if ((errno = PtrToHand(&theFileSave,&rsrcHandle,sizeof(fileSaveRec))) || (errno = MemError()))
return(errno);
BlockMove(theFileSave.fileName,rsrcTitle,32);
CtoPstr(rsrcTitle);
AddResource(rsrcHandle,'FPTH',rsrcID,rsrcTitle);
if (! ResError())
WriteResource(rsrcHandle);
DisposHandle(rsrcHandle);
return(ResError());
}
/*************************************************************************/
short fileGetFromRsrc(
fileFindRec *fileFindPtr,
short rsrcID)
{
fileSaveRec theFileSave;
Handle rsrcHandle;
short errno;
rsrcHandle = GetResource('FPTH',rsrcID);
if (ResError())
return(ResError());
if (! rsrcHandle)
return(resNotFound);
BlockMove(*rsrcHandle,&theFileSave,sizeof(fileSaveRec));
ReleaseResource(rsrcHandle);
if (errno = fileSaveToFind(&theFileSave,fileFindPtr))
return(errno);
return(noErr);
}
/*
-----------------------------------------------------------------------------
returns with the path in thePathStr IE DISK:HELLO:WORLD
-----------------------------------------------------------------------------
*/
short fileFindToPath(
fileFindRec *fileFindPtr,
char *thePathStr)
{
register HFileInfo cp;
short errno;
char dirName[32];
BlockMove(fileFindPtr->fileName,thePathStr,32);
CtoPstr(thePathStr);
cp.ioNamePtr = (StringPtr) dirName;
cp.ioVRefNum = fileFindPtr->ioVRefNum;
cp.ioDirID = fileFindPtr->ioDirID;
cp.ioFDirIndex = -1;
if (errno = PBGetCatInfo(&cp, FALSE))
return(errno);
if (Prepend (thePathStr, cp.ioNamePtr))
return(1);
while (cp.ioDirID != 2)
{
cp.ioDirID = cp.ioFlParID;
cp.ioFDirIndex = -1;
if (errno = PBGetCatInfo(&cp, FALSE))
return(errno);
if (Prepend (thePathStr, cp.ioNamePtr))
return(1);
}
return(noErr);
}
/*
-----------------------------------------------------------------------------
checks to see if the file record is a valid one
false if no error, otherwise a file manager error.
-----------------------------------------------------------------------------
*/
/*is this a valid record*/
fileTest(
fileFindRec *fileFindPtr)
{
HFileInfo cp;
char fileStr[32];
BlockMove(fileFindPtr->fileName,fileStr,32);
CtoPstr(fileStr);
cp.ioVRefNum = fileFindPtr->ioVRefNum;
cp.ioDirID = fileFindPtr->ioDirID;
cp.ioNamePtr = fileStr;
cp.ioFDirIndex = 0;
return(PBGetCatInfo(&cp,false));
}
/*
-----------------------------------------------------------------------------
*/
static short scanAllVolumes(
register HFileInfo *cp,
register Ptr filenamePtr,
Boolean restrict)
{
register int retval;
HVolumeParam vp;
char vname[32];
vp.ioNamePtr = vname;
vp.ioVRefNum = 0;
for (vp.ioVolIndex = 1; !PBGetVInfo(&vp, false); vp.ioVolIndex++)
{
cp->ioVRefNum = vp.ioVRefNum;
cp->ioDirID = 2L; /* start at root */
if (restrict)
retval = PBGetCatInfo(cp,false);
else
retval = scanFolder(cp,filenamePtr);
if (retval != fnfErr)
break;
}
return(retval);
}
/*
-----------------------------------------------------------------------------
*/
static short scanAllWD(
register HFileInfo *cp,
Ptr filenamePtr,
Boolean restrict)
{
register int retval;
WDPBRec wp;
wp.ioCompletion = 0L;
wp.ioNamePtr = 0L;
wp.ioVRefNum = 0; /* Look at all volumes */
wp.ioWDProcID = 0l; /* Look at all working directories */
for (wp.ioWDIndex = 1; !PBGetWDInfo(&wp, false); wp.ioWDIndex++)
{
cp->ioVRefNum = wp.ioVRefNum;
cp->ioDirID = wp.ioWDDirID;
if (restrict)
retval = PBGetCatInfo(cp,false);
else
retval = scanFolder(cp,filenamePtr);
if (retval != fnfErr)
break;
wp.ioVRefNum = 0;
}
return(retval);
}
/*
-----------------------------------------------------------------------------
*/
static short fileFindToSave(
fileFindRec *fileFindPtr,
fileSaveRec *fileSavePtr)
{
HVolumeParam HParmBlkRec;
short errno;
memset(&HParmBlkRec,0,sizeof(HVolumeParam));
memset(fileSavePtr,0,sizeof(fileSaveRec));
BlockMove(fileFindPtr->fileName,fileSavePtr->fileName,32);
fileSavePtr->ioDirID = fileFindPtr->ioDirID;
HParmBlkRec.ioNamePtr = fileSavePtr->volName;
HParmBlkRec.ioVRefNum = fileFindPtr->ioVRefNum;
errno = PBHGetVInfo(&HParmBlkRec,false);
PtoCstr(fileSavePtr->volName);
return(errno);
}
/*
-----------------------------------------------------------------------------
*/
static short fileSaveToFind(
fileSaveRec *fileSavePtr,
fileFindRec *fileFindPtr)
{
HVolumeParam HParmBlkRec;
short errno;
char volName[32];
memset(&HParmBlkRec,0,sizeof(HVolumeParam));
memset(fileFindPtr,0,sizeof(fileFindRec));
BlockMove(fileSavePtr->fileName,fileFindPtr->fileName,32);
fileFindPtr->ioDirID = fileSavePtr->ioDirID;
CtoPstr(fileSavePtr->volName);
BlockMove(fileSavePtr->volName,volName,32);
volName[0]++;
volName[volName[0]] = ':';
HParmBlkRec.ioNamePtr = volName;
HParmBlkRec.ioVolIndex = -1;
errno = PBHGetVInfo(&HParmBlkRec,false);
fileFindPtr->ioVRefNum = HParmBlkRec.ioVRefNum;
return(errno);
}
/*
-----------------------------------------------------------------------------
*/
static short Prepend( s1, s2 )
register char s1[], s2[];
{
register int i,j;
i = s1[0];
j = s2[0];
if ((i+j)>255)
return(1); /* Our path is longer than 255 */
s1[0] = i+j;
if (i>0)
{
j++;
do s1[i+j] = s1[i]; while (--i);
s1[j--] = ':';
s1[0]++;
}
do s1[j] = s2[j]; while (--j);
return(noErr);
}
/*
-----------------------------------------------------------------------------
*/
static short scanFolder(
register HFileInfo *myCPB,
register Ptr filenamePtr) /* a PString */
{
register OSErr retval = 0;
register long dirIDToSearch = myCPB->ioDirID;
register short index=1; /* for ioFDirIndex */
do
{
myCPB->ioFDirIndex = index; /* set up the index */
myCPB->ioDirID = dirIDToSearch; /* we need to do this every time through, since GetCatInfo returns ioFlNum in this field*/
retval = PBGetCatInfo(myCPB,false);
if (retval == noErr)
{
/* check the file attributes for folderhood */
if (myCPB->ioFlAttrib & fIsDir)
{ /*we have a dir*/
if (retval = scanFolder(myCPB,filenamePtr)) /* Process this folder */
retval = noErr; /* reset the error message */
else
break;
} /* end if myCPB->ioFlAttrib */
else
{ /*we have a file*/
if (EqualString(myCPB->ioNamePtr,filenamePtr,false,false))
break;
} /* end else*/
index++; /* increment the index for GetCatInfo */
} /* end if (retval == noErr) */
} while (retval == noErr);
return(retval);
}